package com.example.location;

import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;

import androidx.appcompat.app.AppCompatActivity;

import com.alibaba.android.arouter.facade.annotation.Route;
import com.alibaba.android.arouter.launcher.ARouter;
import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.BDNotifyListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.map.Overlay;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.map.TitleOptions;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.walknavi.WalkNavigateHelper;
import com.baidu.mapapi.walknavi.adapter.IWEngineInitListener;
import com.baidu.mapapi.walknavi.adapter.IWRoutePlanListener;
import com.baidu.mapapi.walknavi.model.WalkRoutePlanError;
import com.baidu.mapapi.walknavi.params.WalkNaviLaunchParam;
import com.baidu.mapapi.walknavi.params.WalkRouteNodeInfo;
import com.example.lib_common.RouterPaths;
import com.example.lib_common.TLog;
import com.example.location.databinding.ActivityLocationBinding;

import java.util.ArrayList;
import java.util.List;

/**
 * author : 浪
 * date :2024/11/29 16:02
 * desc:
 */

@Route(path = RouterPaths.Location.PAGE_LOCATION_ACTIVITY)
public class LocationActivity extends AppCompatActivity {

    // 定位图层显示方式
    private MyLocationConfiguration.LocationMode mCurrentMode;
    String TAG = "定位_";
    private ActivityLocationBinding binding;
    private MapView mMapView = null;

    BaiduMap mBaiduMap;

    LocationClient mLocationClient;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        binding = ActivityLocationBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
//
        try {
            ARouter.getInstance().inject(this);
        } catch (Exception e) {
            e.printStackTrace();
        }

        //获取地图控件引用
        mMapView = binding.bmapView;

        mBaiduMap = mMapView.getMap();
        // 设置空白地图
        //mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NONE);
        // 设置地图背景色
        //mBaiduMap.setMapBackgroundColor(Color.argb(255, 255, 0, 0));
        //设置地图的缩放级别：
//        MapStatus.Builder builder = new MapStatus.Builder();
//        builder.zoom(18.0f);
//        mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
//

        //是否开启指南针
        mBaiduMap.setCompassEnable(true);


        boolean agreePrivacy = SDKInitializer.getAgreePrivacy();
        TLog.i(TAG, "发起定位 agreePrivacy: " + agreePrivacy);


//
//        BitmapDescriptor customMarker = BitmapDescriptorFactory.fromResource(R.drawable.icon_blue);
//        //导航箭头
//        BitmapDescriptor arrow = BitmapDescriptorFactory.fromResource(R.drawable.icon_arrow);
//
//        mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL;
//
//
//        final MyLocationConfiguration myLocationConfiguration = new MyLocationConfiguration.Builder(mCurrentMode, true)
//                .setArrow(arrow).setArrowSize(0.5f)
//                .setCustomMarker(customMarker).setMarkerSize(0.2f)
//                .setAnimation(true).setMarkerRotation(false)
//                .build();
//
//        mBaiduMap.setMyLocationConfiguration(myLocationConfiguration);
//


        //5. 通过LocationClient发起定位
//定位初始化

        initLocationOption();

        addOverlayMarker();




        // 获取导航控制类
// 引擎初始化 使用步行导航前需要对步行导航引擎初始化。
//        WalkNavigateHelper.getInstance().initNaviEngine(this, new IWEngineInitListener() {
//
//            @Override
//            public void engineInitSuccess() {
//                //引擎初始化成功的回调
//                routeWalkPlanWithParam();
//            }
//
//            @Override
//            public void engineInitFail() {
//                //引擎初始化失败的回调
//            }
//        });


    }

    //发起算路
    private void routeWalkPlanWithParam() {

        //起终点位置
        LatLng  startPt = new LatLng(40.047416,116.312143);
        LatLng  endPt = new LatLng(40.048424, 116.313513);
//构造WalkNaviLaunchParam
        WalkNaviLaunchParam mWalkParam = new WalkNaviLaunchParam().stPt(startPt).endPt(endPt);



        //发起算路
        WalkNavigateHelper.getInstance().routePlanWithRouteNode(mWalkParam, new IWRoutePlanListener() {
            @Override
            public void onRoutePlanStart() {
                //开始算路的回调
            }

            @Override
            public void onRoutePlanSuccess() {
                //算路成功
                //跳转至诱导页面
//                Intent intent = new Intent(BNaviMainActivity.this, WNaviGuideActivity.class);
//                startActivity(intent);


                //获取WalkNavigateHelper实例
                WalkNavigateHelper   mNaviHelper = WalkNavigateHelper.getInstance();
//获取诱导页面地图展示View
                View view = mNaviHelper.onCreate(LocationActivity.this);
                if (view != null) {
                    setContentView(view);
                }
                mNaviHelper.startWalkNavi(LocationActivity.this);
            }

            @Override
            public void onRoutePlanFail(WalkRoutePlanError walkRoutePlanError) {
                //算路失败的回调
            }
        });
    }


    //我们通过继承抽象类BDAbstractListener并重写其onReceieveLocation方法来获取定位数据，并将其传给MapView。
    public class MyLocationListener extends BDAbstractLocationListener {
        @Override
        public void onReceiveLocation(BDLocation location) {
            TLog.i(TAG, "发起定位 获取定位数据 " + location.toString());


            //此处的BDLocation为定位结果信息类，通过它的各种get方法可获取定位相关的全部结果
            //以下只列举部分获取经纬度相关（常用）的结果信息
            //更多结果信息获取说明，请参照类参考中BDLocation类中的说明

            //获取纬度信息
            double latitude = location.getLatitude();
            //获取经度信息
            double longitude = location.getLongitude();
            //获取定位精度，默认值为0.0f
            float radius = location.getRadius();
            //获取经纬度坐标类型，以LocationClientOption中设置过的坐标类型为准
            String coorType = location.getCoorType();
            //获取定位类型、定位错误返回码，具体信息可参照类参考中BDLocation类中的说明
            int errorCode = location.getLocType();


            //mapView 销毁后不在处理新接收的位置
            if (location == null || mMapView == null) {
                return;
            }
            // 开启地图的定位图层
            mBaiduMap.setMyLocationEnabled(true);
            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(location.getRadius())
                    // 此处设置开发者获取到的方向信息，顺时针0-360
                    .direction(location.getDirection()).latitude(location.getLatitude())
                    .longitude(location.getLongitude()).build();
            TLog.i(TAG, "发起定位 获取定位数据 " +
                    "  accuracy: " + location.getRadius() +
                    "  direction: " + location.getDirection() +
                    "  latitude: " + location.getLatitude() +
                    "  longitude: " + location.getLongitude()


            );

            MapStatus.Builder builder = new MapStatus.Builder();
            builder.zoom(18.0f);
            LatLng ll = new LatLng(location.getLatitude(),
                    location.getLongitude());
            builder.target(ll);
            mBaiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));


            mBaiduMap.setMyLocationData(locData);


        }
    }


    /**
     * 初始化定位参数配置
     */


    private void initLocationOption() {
        //定位服务的客户端。宿主程序在客户端声明此类，并调用，目前只支持在主线程中启动


        //https://lbs.baidu.com/faq/api?title=android-locsdk

        try {
            mLocationClient = new LocationClient(getApplicationContext());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        //声明LocationClient类实例并配置定位参数
        LocationClientOption locationOption = new LocationClientOption();
        MyLocationListener myLocationListener = new MyLocationListener();
        //注册监听函数
        mLocationClient.registerLocationListener(myLocationListener);
        //可选，默认高精度，设置定位模式，高精度，低功耗，仅设备
        //locationOption.setLocationMode(LocationMode.Hight_Accuracy);
        locationOption.setOpenGps(true); // 打开gps
        //可选，默认gcj02，设置返回的定位结果坐标系，如果配合百度地图使用，建议设置为bd09ll;
        locationOption.setCoorType("bd09ll"); // 设置坐标类型

        //可选，默认0，即仅定位一次，设置发起连续定位请求的间隔需要大于等于1000ms才是有效的
        locationOption.setScanSpan(3000);
        //可选，设置是否需要地址信息，默认不需要
        locationOption.setIsNeedAddress(true);
        //可选，设置是否需要地址描述
        locationOption.setIsNeedLocationDescribe(true);
        //可选，设置是否需要设备方向结果
        locationOption.setNeedDeviceDirect(false);
        //可选，默认false，设置是否当卫星定位有效时按照1S1次频率输出卫星定位结果
        locationOption.setLocationNotify(true);
        //可选，默认true，定位SDK内部是一个SERVICE，并放到了独立进程，设置是否在stop的时候杀死这个进程，默认不杀死
        locationOption.setIgnoreKillProcess(true);
        //可选，默认false，设置是否需要位置语义化结果，可以在BDLocation.getLocationDescribe里得到，结果类似于“在北京天安门附近”
        locationOption.setIsNeedLocationDescribe(true);
        //可选，默认false，设置是否需要POI结果，可以在BDLocation.getPoiList里得到
        locationOption.setIsNeedLocationPoiList(true);
        //可选，默认false，设置是否收集CRASH信息，默认收集
        locationOption.SetIgnoreCacheException(false);
        //可选，默认false，设置是否开启卫星定位
        locationOption.setOpenGnss(true);
        //可选，默认false，设置定位时是否需要海拔信息，默认不需要，除基础定位版本都可用
        locationOption.setIsNeedAltitude(false);
        //设置打开自动回调位置模式，该开关打开后，期间只要定位SDK检测到位置变化就会主动回调给开发者，该模式下开发者无需再关心定位间隔是多少，定位SDK本身发现位置变化就会及时回调给开发者
        locationOption.setOpenAutoNotifyMode();
        //设置打开自动回调位置模式，该开关打开后，期间只要定位SDK检测到位置变化就会主动回调给开发者
        locationOption.setOpenAutoNotifyMode(3000, 1, LocationClientOption.LOC_SENSITIVITY_HIGHT);
        //需将配置好的LocationClientOption对象，通过setLocOption方法传递给LocationClient对象使用
        mLocationClient.setLocOption(locationOption);
        //开始定位
        mLocationClient.start();


        //位置提醒
        myNotifyLister = new MyNotifyLister();
        //调用BDNotifyListener的setNotifyLocation方法，实现设置位置消息提醒。
        //设置位置提醒，四个参数分别是：纬度、精度、半径、坐标类型
        myNotifyLister.SetNotifyLocation(40.0f, 116.0f, 3000, mLocationClient.getLocOption().getCoorType());
//        //启动定位，SDK便会自动开启位置消息提醒的监听
//        mLocationClient.start();
        //调用BDNotifyListener的removeNotifyEvent方法，实现取消位置监听
//        mLocationClient.removeNotifyEvent(myListener);
        //注册监听函数
        mLocationClient.registerNotify(myNotifyLister);
    }


    public BDNotifyListener myNotifyLister = new MyNotifyLister();

    /**
     * 定义MyNotifyLister类，继承BDNotifyListener，实现位置监听的回调。
     */
    public class MyNotifyLister extends BDNotifyListener {
        public void onNotify(BDLocation mlocation, float distance) {
            //已到达设置监听位置附近

        }
    }


    //添加Marker
    //https://lbs.baidu.com/faq/api?title=androidsdk/guide/render-map/point

    List<Overlay> vOverlay = new ArrayList<>();

    void addOverlayMarker() {


        TitleOptions titleOptions = new TitleOptions()
                .text("我是A")
                .titleBgColor(Color.RED)
                .titleFontSize(48);


        //定义Maker坐标点
        LatLng point = new LatLng(39.963175, 116.400244);
//        //构建Marker图标
        BitmapDescriptor bitmap = BitmapDescriptorFactory
                .fromResource(R.drawable.ic_launcher);
        //构建MarkerOption，用于在地图上添加Marker
        MarkerOptions option = new MarkerOptions()
                .position(point)
                .titleOptions(titleOptions)
                .icon(bitmap);
//在地图上添加Marker，并显示
        Overlay overlay = mBaiduMap.addOverlay(option);

        vOverlay.add(overlay);
        //Marker点击事件
        //https://lbs.baidu.com/faq/api?title=androidsdk/guide/render-map/point
        mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
            //marker被点击时回调的方法
            //若响应点击事件，返回true，否则返回false
            //默认返回false
            @Override
            public boolean onMarkerClick(Marker marker) {
                //移除不掉title
//                mBaiduMap.removeOverLays(vOverlay);
                //可以移除title
                mBaiduMap.clear();
                return true;
            }
        });

//        mBaiduMap.removeOverLays();
    }


    @Override
    protected void onResume() {
        super.onResume();
        //在activity执行onResume时执行mMapView. onResume ()，实现地图生命周期管理
        mMapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        //在activity执行onPause时执行mMapView. onPause ()，实现地图生命周期管理
        mMapView.onPause();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //在activity执行onDestroy时执行mMapView.onDestroy()，实现地图生命周期管理

        mLocationClient.stop();
        mBaiduMap.setMyLocationEnabled(false);
        mMapView.onDestroy();
        mMapView = null;

    }
}
